package com.gmail.nuclearcat1337.kits;
import java.util.ArrayList;
import java.util.List;

import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;

import com.gmail.nuclearcat1337.anniPro.anniGame.AnniPlayer;
import com.gmail.nuclearcat1337.anniPro.anniGame.Game;
import com.gmail.nuclearcat1337.anniPro.kits.KitUtils;
import com.gmail.nuclearcat1337.anniPro.kits.Loadout;
import com.gmail.nuclearcat1337.anniPro.voting.ConfigManager;
import com.gmail.nuclearcat1337.base.ConfigurableKit;
import com.gmail.nuclearcat1337.base.Delays;
import com.gmail.nuclearcat1337.base.StandardItemUpdater;
import com.google.common.base.Function;


public class Succubus extends ConfigurableKit
{
	private ItemStack sucItem;
	private String sucItemName;
	
	@Override
	protected void setUp()
	{
		sucItem = KitUtils.addSoulbound(getIcon().clone());
		ItemMeta m = sucItem.getItemMeta();
		m.setDisplayName(sucItemName);
		sucItem.setItemMeta(m);
		Delays.getInstance().createNewDelay(getInternalName(), new StandardItemUpdater(sucItemName,sucItem.getType(),new Function<ItemStack,Boolean>(){
			@Override
			public Boolean apply(ItemStack stack)
			{
				return isSuccubusItem(stack);
			}}));
	}
	
	private boolean isSuccubusItem(ItemStack stack)
	{
		if(stack != null && stack.hasItemMeta() && stack.getItemMeta().hasDisplayName())
		{
			String name = stack.getItemMeta().getDisplayName();
			if(name.contains(this.sucItemName) && KitUtils.isSoulbound(stack))
				return true;
		}
		return false;
	}	

	@Override
	protected String getInternalName()
	{
		return "Succubus";
	}

	@SuppressWarnings("deprecation")
	@Override
	protected ItemStack getIcon()
	{
		return new ItemStack(Material.INK_SACK, 1, (short) 0, (byte) 1);
	}

	@Override
	protected int setDefaults(ConfigurationSection section)
	{
		//section.set("SuccubusItemName", aqua+"Life Drain");
		return ConfigManager.setDefaultIfNotSet(section, "SuccubusItemName", aqua+"Life Drain");
	}
	
	@Override
	protected void loadKitStuff(ConfigurationSection section)
	{
		super.loadKitStuff(section);
		sucItemName = section.getString("SuccubusItemName");
	}

	@Override
	protected List<String> getDefaultDescription()
	{
		List<String> l = new ArrayList<String>();
		addToList(l,new String[]
				{
					aqua+"You are the hunter.",
					"",
					aqua+"Once every 2 minutes the",
					aqua+"Succubus can attempt to",
					aqua+"suck the remaining life",
					aqua+"out of an enemy player.",
					"",
					aqua+"If the enemy player has",
					aqua+"less than 40% health,",
					aqua+"they are killed immediately",
					aqua+"and the remaining health",
					aqua+"is transferred to the",
					aqua+"Succubus.",
					"",
					aqua+"However, if the enemy",
					aqua+"player has more than 40%",
					aqua+"health, the Succubus is",
					aqua+"dealt the enemy player's",
					aqua+"remaining health in true",
					aqua+"damage.",
				});
		return l;
	}

	@Override
	public void cleanup(Player arg0)
	{

	}

//	@Override
//	public void onPlayerSpawn(Player player)
//	{
//		KitUtils.giveTeamArmor(player);
//		player.getInventory().addItem(KitUtils.getStoneSword());
//		player.getInventory().addItem(KitUtils.getWoodPick());
//		player.getInventory().addItem(KitUtils.getWoodAxe());
//		player.getInventory().addItem(this.sucItem.clone());
//		player.getInventory().addItem(KitUtils.getNavCompass());
//	}
	
	@Override
	protected Loadout getFinalLoadout()
	{
		return new Loadout().addStoneSword().addWoodPick().addWoodAxe().addItem(this.sucItem);
	}
	
	@EventHandler(priority = EventPriority.HIGHEST,ignoreCancelled = true)
	public void lifeDrain(PlayerInteractEntityEvent event)
	{
		if(Game.isGameRunning() && event.getRightClicked().getType() == EntityType.PLAYER)
		{
			Player user = event.getPlayer();
			AnniPlayer anniUser = AnniPlayer.getPlayer(user.getUniqueId());
			if(anniUser != null && anniUser.getKit().equals(this))
			{
				if(!Delays.getInstance().hasActiveDelay(user, this.getInternalName()))
				{
					Player target = (Player)event.getRightClicked();
					AnniPlayer t = AnniPlayer.getPlayer(target.getUniqueId());
					if(t != null && !t.getTeam().equals(anniUser.getTeam()))
					{
						Delays.getInstance().addDelay(user, System.currentTimeMillis()+120000, this.getInternalName());
						if((target.getHealth() / target.getMaxHealth()) <= .42)
						{
							double newHealth = user.getHealth() + target.getHealth();
							if(newHealth > user.getMaxHealth())
								newHealth = user.getMaxHealth();
							user.setHealth(newHealth);
							//target.setHealth(0);
							target.damage(100, user);
							user.playSound(user.getLocation(), Sound.BLAZE_BREATH, 1, 1.2F);
						}
						else
						{
							double newHealth = user.getHealth() - target.getHealth();
							if(newHealth < 0)
								newHealth = 0;
							user.setHealth(newHealth);
						}
					}
				}
			}
		}
	}
}